/**
 * 处理图片上传中间件
 */

const multer = require('multer')
const path = require('path')
const fs = require('fs')

// 创建存储配置(支持动态指定存储目录canvas-images/avatar)
const createStorage = (dirName) => {
  console.log('后端createStorage', dirName)
  // diskStorage：本地磁盘存储
  return multer.diskStorage({
    // 指定存储目录
    destination: (req, file, cb) => {
      // 拼接存储目录
      const uploadDir = path.join(__dirname, '../public', dirName)
      console.log('后端uploadDir', uploadDir)
      // 创建目录
      if (!uploadDir) {
        fs.mkdirSync(uploadDir, { recursive: true }, (err) => {
          if (err) {
            console.error('创建目录失败:', err)
            cb(err, uploadDir)
          }
        })
      }
      // 返回存储目录
      cb(null, uploadDir)
    },
    // 指定文件名
    filename: (req, file, cb) => {
      // 获取时间戳
      const timestamp = Date.now()
      // 获取随机字符串
      const randomStr = Math.round(Math.random() * 1e9).toString(36)
      // 获取文件扩展名
      const ext = path.extname(file.originalname)
      // 获取文件名
      const baseName = path.basename(file.originalname, ext)
      // 生成唯一文件名
      const filename = `${timestamp}-${randomStr}-${baseName}${ext}`
      console.log('生成的文件名:', filename);
      // 返回文件名
      cb(null, filename)
    }
  })
}

// 普通图片类型过滤：仅支持png、jpg、jpeg、webp格式,本项目中用在上传头像
const imageFilter = (req, file, cb) => {
  // 获取文件扩展名
  const ext = path.extname(file.originalname).toLowerCase()
  // 支持的图片格式
  const allowedExts = ['.png', '.jpg', '.jpeg', '.webp']
  // 检查文件扩展名是否在允许的列表中
  if (allowedExts.includes(ext)) {
    cb(null, true)
  } else {
    // 拒绝上传
    cb(new Error('仅支持png、jpg、jpeg、webp格式'), false)
  }
}

// 导出不同场景的上传中间件
module.exports = {
  // 画布图片上传
  uploadCanvas: multer({
    storage: createStorage('canvas-images'),
    // 临时使用内存存储（不写入磁盘，仅验证是否能解析文件）
    // storage: multer.memoryStorage(),
  }),
  // 用户头像上传
  uploadAvatar: multer({
    storage: createStorage('avatars'),
    fileFilter: imageFilter,
    limits: { fileSize: 5 * 1024 * 1024 } // 限制5MB
  })
}